# -*- coding: utf-8 -*-
"""
心理咨询师服务系统 - 错误处理
"""

from flask import jsonify, request, current_app
from app.main import bp
from app import db


@bp.app_errorhandler(400)
def bad_request(error):
    """400错误处理"""
    return jsonify({
        'success': False,
        'error': 'Bad Request',
        'message': '请求参数错误',
        'status_code': 400
    }), 400


@bp.app_errorhandler(401)
def unauthorized(error):
    """401错误处理"""
    return jsonify({
        'success': False,
        'error': 'Unauthorized',
        'message': '未授权访问',
        'status_code': 401
    }), 401


@bp.app_errorhandler(403)
def forbidden(error):
    """403错误处理"""
    return jsonify({
        'success': False,
        'error': 'Forbidden',
        'message': '禁止访问',
        'status_code': 403
    }), 403


@bp.app_errorhandler(404)
def not_found(error):
    """404错误处理"""
    return jsonify({
        'success': False,
        'error': 'Not Found',
        'message': '请求的资源不存在',
        'status_code': 404
    }), 404


@bp.app_errorhandler(405)
def method_not_allowed(error):
    """405错误处理"""
    return jsonify({
        'success': False,
        'error': 'Method Not Allowed',
        'message': '请求方法不被允许',
        'status_code': 405
    }), 405


@bp.app_errorhandler(422)
def unprocessable_entity(error):
    """422错误处理"""
    return jsonify({
        'success': False,
        'error': 'Unprocessable Entity',
        'message': '请求格式正确，但语义错误',
        'status_code': 422
    }), 422


@bp.app_errorhandler(429)
def too_many_requests(error):
    """429错误处理"""
    return jsonify({
        'success': False,
        'error': 'Too Many Requests',
        'message': '请求过于频繁，请稍后重试',
        'status_code': 429
    }), 429


@bp.app_errorhandler(500)
def internal_error(error):
    """500错误处理"""
    db.session.rollback()
    current_app.logger.error(f'服务器内部错误: {str(error)}')
    
    return jsonify({
        'success': False,
        'error': 'Internal Server Error',
        'message': '服务器内部错误，请稍后重试',
        'status_code': 500
    }), 500


@bp.app_errorhandler(502)
def bad_gateway(error):
    """502错误处理"""
    return jsonify({
        'success': False,
        'error': 'Bad Gateway',
        'message': '网关错误',
        'status_code': 502
    }), 502


@bp.app_errorhandler(503)
def service_unavailable(error):
    """503错误处理"""
    return jsonify({
        'success': False,
        'error': 'Service Unavailable',
        'message': '服务暂时不可用',
        'status_code': 503
    }), 503


@bp.app_errorhandler(504)
def gateway_timeout(error):
    """504错误处理"""
    return jsonify({
        'success': False,
        'error': 'Gateway Timeout',
        'message': '网关超时',
        'status_code': 504
    }), 504


# JWT错误处理
try:
    from flask_jwt_extended.exceptions import (
        JWTExtendedException, NoAuthorizationError, InvalidHeaderError,
        ExpiredSignatureError, RevokedTokenError
    )
except ImportError:
    # 兼容新版本的 flask_jwt_extended
    from flask_jwt_extended.exceptions import (
        JWTExtendedException, NoAuthorizationError
    )
    # 在新版本中，这些异常可能不存在或名称有变化
    InvalidHeaderError = None
    ExpiredSignatureError = None
    RevokedTokenError = None


@bp.app_errorhandler(NoAuthorizationError)
def handle_no_authorization_error(error):
    """处理缺少授权头错误"""
    return jsonify({
        'success': False,
        'error': 'No Authorization',
        'message': '缺少授权信息',
        'status_code': 401
    }), 401


if InvalidHeaderError is not None:
    @bp.app_errorhandler(InvalidHeaderError)
    def handle_invalid_header_error(error):
        """处理无效授权头错误"""
        return jsonify({
            'success': False,
            'error': 'Invalid Header',
            'message': '授权头格式错误',
            'status_code': 401
        }), 401


# InvalidTokenError 在新版本的 flask_jwt_extended 中已移除


# 只在异常类存在且不为None时注册错误处理器
if ExpiredSignatureError is not None:
    @bp.app_errorhandler(ExpiredSignatureError)
    def handle_expired_signature_error(error):
        """处理令牌过期错误"""
        return jsonify({
            'success': False,
            'error': 'Token Expired',
            'message': '访问令牌已过期',
            'status_code': 401
        }), 401


if RevokedTokenError is not None:
    @bp.app_errorhandler(RevokedTokenError)
    def handle_revoked_token_error(error):
        """处理已撤销令牌错误"""
        return jsonify({
            'success': False,
            'error': 'Token Revoked',
            'message': '访问令牌已被撤销',
            'status_code': 401
        }), 401


# 数据库错误处理
from sqlalchemy.exc import (
    IntegrityError, DataError, DatabaseError,
    InvalidRequestError, TimeoutError
)


@bp.app_errorhandler(IntegrityError)
def handle_integrity_error(error):
    """处理数据完整性错误"""
    db.session.rollback()
    current_app.logger.error(f'数据完整性错误: {str(error)}')
    
    return jsonify({
        'success': False,
        'error': 'Data Integrity Error',
        'message': '数据完整性约束违反',
        'status_code': 400
    }), 400


@bp.app_errorhandler(DataError)
def handle_data_error(error):
    """处理数据错误"""
    db.session.rollback()
    current_app.logger.error(f'数据错误: {str(error)}')
    
    return jsonify({
        'success': False,
        'error': 'Data Error',
        'message': '数据格式错误',
        'status_code': 400
    }), 400


@bp.app_errorhandler(DatabaseError)
def handle_database_error(error):
    """处理数据库错误"""
    db.session.rollback()
    current_app.logger.error(f'数据库错误: {str(error)}')
    
    return jsonify({
        'success': False,
        'error': 'Database Error',
        'message': '数据库连接错误',
        'status_code': 500
    }), 500


@bp.app_errorhandler(TimeoutError)
def handle_timeout_error(error):
    """处理超时错误"""
    db.session.rollback()
    current_app.logger.error(f'数据库超时: {str(error)}')
    
    return jsonify({
        'success': False,
        'error': 'Database Timeout',
        'message': '数据库操作超时',
        'status_code': 504
    }), 504